//******************************************************************
//******************************************************************
//**********          ANts Peer To Peer Sources        *************
//
// ANts P2P realizes a third generation P2P net. It protects your
// privacy while you are connected and makes you not trackable, hiding
// your identity (ip) and crypting everything you are sending/receiving
// from others.

// Copyright (C) 2004  Roberto Rossi

// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

package ants.p2p.gui;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.util.*;

import ants.p2p.filesharing.*;
import ants.p2p.messages.PrivateChatMessage;

import org.apache.log4j.*;

public class PrivateChatFrame extends JFrame implements PropertyChangeListener{
  BorderLayout borderLayout1 = new BorderLayout();
  JScrollPane jScrollPane1 = new JScrollPane();
  JEditorPane jEditorPane1 = new JEditorPane();
  JTextField jTextField1 = new JTextField();

  String peerId = null;
  WarriorAnt wa = null;
  boolean initiator;

  public static Hashtable activeChats = new Hashtable();

  static Logger _logger = Logger.getLogger(PrivateChatFrame.class.getName());

  public PrivateChatFrame(String peerId, WarriorAnt wa, boolean initiator) {
    super("Chatting with: "+peerId.substring(0,10));
    this.setBounds(100,100,300,300);
    this.peerId = peerId;
    this.wa = wa;
    this.initiator = initiator;
    this.wa.getPropertyChangeSupport().addPropertyChangeListener(this);
    try {
      jbInit();
    }
    catch(Exception ex) {
      ex.printStackTrace();
    }
  }

  public static PrivateChatFrame getChatWith(String peerId, WarriorAnt wa, boolean initiator){
    PrivateChatFrame pcf = (PrivateChatFrame)PrivateChatFrame.activeChats.get(peerId);
    if(pcf != null) return pcf;
    else{
      pcf = new PrivateChatFrame(peerId, wa, initiator);
      activeChats.put(peerId, pcf);
      return pcf;
    }
  }

  public static void removeChatWith(String peerId, WarriorAnt wa){
    PrivateChatFrame pcf = (PrivateChatFrame)PrivateChatFrame.activeChats.get(peerId);
    if(pcf != null){
      activeChats.remove(peerId);
      wa.getPropertyChangeSupport().removePropertyChangeListener(pcf);
      pcf.hide();
    }
  }

  public static void removeAllChats(WarriorAnt wa){
    Enumeration keys = activeChats.keys();
    while(keys.hasMoreElements()){
      removeChatWith((String)keys.nextElement(),wa);
    }
  }

  public void propertyChange(PropertyChangeEvent e){
    if(e.getPropertyName().equals("privateChatMessageSending")){
      PrivateChatMessage pcm = (PrivateChatMessage)e.getNewValue();
      if(pcm.getDest().equals(this.peerId))
        this.setTitle("Chatting with: "+peerId.substring(0,10)+"   [Sending message...]");
    }else if(e.getPropertyName().equals("privateChatMessageFailed")){
      PrivateChatMessage pcm = (PrivateChatMessage)e.getNewValue();
      if(pcm.getDest().equals(this.peerId)){
        this.setTitle("Chatting with: " + peerId.substring(0, 10));
        JOptionPane.showMessageDialog(this, ji.JI.i("Error in sending message!"),
                                      ji.JI.i("Chat error"),
                                      JOptionPane.ERROR_MESSAGE);
      }
    }else if(e.getPropertyName().equals("privateChatMessageDelivered")){
      PrivateChatMessage pcm = (PrivateChatMessage)e.getNewValue();
      if(pcm.getDest().equals(this.peerId)){
        this.setTitle("Chatting with: " + peerId.substring(0, 10));
        this.jEditorPane1.setText(this.jEditorPane1.getText() +
                                  "You:\t" + pcm.getContent()+"\n");
      }
    }
  }

  public void insertExternalMessage(String message){
    this.jEditorPane1.setText(this.jEditorPane1.getText() +
                              this.peerId.substring(0,10)+":\t"+message+"\n");
  }

  void jbInit() throws Exception {
    this.getContentPane().setLayout(borderLayout1);
    jScrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    jScrollPane1.setAutoscrolls(true);
    jEditorPane1.setText("");
    jTextField1.setText("");
    jTextField1.addKeyListener(new PrivateChatFrame_jTextField1_keyAdapter(this));
    this.getContentPane().add(jScrollPane1,  BorderLayout.CENTER);
    this.getContentPane().add(jTextField1,  BorderLayout.SOUTH);
    jScrollPane1.getViewport().add(jEditorPane1, null);
  }

  void jTextField1_keyReleased(KeyEvent e) {
    if(e.getKeyChar()=='\n'){
      try{
        String message = this.jTextField1.getText();
        this.jTextField1.setText("");
        this.wa.sendPrivateChatMessage(this.peerId, message, this.initiator);
      }catch(Exception ex){
        _logger.error("",ex);
        JOptionPane.showMessageDialog(this, ji.JI.i("Error in sending message: ")+ex.getMessage(),ji.JI.i("Chat error"),JOptionPane.ERROR_MESSAGE);
      }
    }
  }

}

class PrivateChatFrame_jTextField1_keyAdapter extends java.awt.event.KeyAdapter {
  PrivateChatFrame adaptee;

  PrivateChatFrame_jTextField1_keyAdapter(PrivateChatFrame adaptee) {
    this.adaptee = adaptee;
  }
  public void keyReleased(final KeyEvent e) {
    Thread runner = new Thread(){
      public void run(){
        adaptee.jTextField1_keyReleased(e);
      }
    };
    runner.start();
  }
}
